Summary

This comprehensive data set from The Meteorological Society contains information on all of the known meteorite landings.

Analysis

The goal of this analysis is to create an insightful and interactive data visualization which draws some inference about meteorite landing locations, mass, and year of occurrence.

library(ggplot2)
library(RSocrata)
library(devtools)
library(gganimate)
library(magick)
library(dplyr)
library(ggmap)
library(gapminder)
library(animation)
library(lubridate)
data_in <- read.socrata("https://data.nasa.gov/Space-Science/Meteorite-Landings/gh4g-9sfh")
head(data_in)

Clean up column names

names(data_in)[c(3, 4, 5, 6, 8, 9)] <- c("name_type", "class", "mass", "found", "latitude", "longitude")
names(data_in)
 [1] "name"        "id"          "name_type"   "class"       "mass"        "found"      
 [7] "year"        "latitude"    "longitude"   "GeoLocation"

Fix the year by removing MM-DD

data_in$year_fix <- year(data_in$year)

Explore the variables by class distribution

data_in %>% group_by(class) %>% 
            summarise(n = n()) %>% 
            arrange(desc(n))
data_in %>% group_by(name_type) %>% 
            summarise(n = n()) %>% 
            arrange(desc(n))

Filter out erroneous latitudes and longitudes

data_in_clean <- data_in %>% filter(latitude >= -90 & 
                                    latitude  <= 90 & 
                                    longitude >= -180 &
                                    longitude <= 180  & 
                                    !is.na(mass), 
                                    !is.na(year))

Clean up method of whether the meteorite was Found or not

data_in_clean$found <- if_else(data_in_clean$found == "Fell", "No", "Yes")

Visualizations

Set up some options for plotting

theme_set(theme_minimal())
options(scipen=10000)

Static display

p <- ggplot() +
    borders("world", colour="gray50") +
    geom_point(aes(x = longitude, y = latitude, color = found, frame = year_fix), data = data_in_clean, alpha = .5) +
    labs(title = "Worldwide Meteorite Landings ", 
       x = "", y = "") +
    theme(legend.position="bottom", 
        axis.text.x = element_blank(),
        axis.text.y = element_blank(),
        axis.ticks = element_blank())
Ignoring unknown aesthetics: frame
p

gganimate(p, "meteorite-landings.gif")
Graphs cannot be vertically aligned. Placing graphs unaligned.Graphs cannot be horizontally aligned. Placing graphs unaligned.Executing: 
'convert' -loop 0 -dispose none -delay 0 plot1.png -dispose previous -delay 100
    plot2.png plot3.png plot4.png plot5.png plot6.png plot7.png plot8.png plot9.png
    plot10.png plot11.png plot12.png plot13.png plot14.png plot15.png plot16.png
    plot17.png plot18.png plot19.png plot20.png plot21.png plot22.png plot23.png
    plot24.png plot25.png plot26.png plot27.png plot28.png plot29.png plot30.png
    plot31.png plot32.png plot33.png plot34.png plot35.png plot36.png plot37.png
    plot38.png plot39.png plot40.png plot41.png plot42.png plot43.png plot44.png
    plot45.png plot46.png plot47.png plot48.png plot49.png plot50.png plot51.png
    plot52.png plot53.png plot54.png plot55.png plot56.png plot57.png plot58.png
    plot59.png plot60.png plot61.png plot62.png plot63.png plot64.png plot65.png
    plot66.png plot67.png plot68.png plot69.png plot70.png plot71.png plot72.png
    plot73.png plot74.png plot75.png plot76.png plot77.png plot78.png plot79.png
    plot80.png plot81.png plot82.png plot83.png plot84.png plot85.png plot86.png
    plot87.png plot88.png plot89.png plot90.png plot91.png plot92.png plot93.png
    plot94.png plot95.png plot96.png plot97.png plot98.png plot99.png plot100.png
    plot101.png plot102.png plot103.png plot104.png plot105.png plot106.png
    plot107.png plot108.png plot109.png plot110.png plot111.png plot112.png
    plot113.png plot114.png plot115.png plot116.png plot117.png plot118.png
    plot119.png plot120.png plot121.png plot122.png plot123.png plot124.png
    plot125.png plot126.png plot127.png plot128.png plot129.png plot130.png
    plot131.png plot132.png plot133.png plot134.png plot135.png plot136.png
    plot137.png plot138.png plot139.png plot140.png plot141.png plot142.png
    plot143.png plot144.png plot145.png plot146.png plot147.png plot148.png
    plot149.png plot150.png plot151.png plot152.png plot153.png plot154.png
    plot155.png plot156.png plot157.png plot158.png plot159.png plot160.png
    plot161.png plot162.png plot163.png plot164.png plot165.png plot166.png
    plot167.png plot168.png plot169.png plot170.png plot171.png plot172.png
    plot173.png plot174.png plot175.png plot176.png plot177.png plot178.png
    plot179.png plot180.png plot181.png plot182.png plot183.png plot184.png
    plot185.png plot186.png plot187.png plot188.png plot189.png plot190.png
    plot191.png plot192.png plot193.png plot194.png plot195.png plot196.png
    plot197.png plot198.png plot199.png plot200.png plot201.png plot202.png
    plot203.png plot204.png plot205.png plot206.png plot207.png plot208.png
    plot209.png plot210.png plot211.png plot212.png plot213.png plot214.png
    plot215.png plot216.png plot217.png plot218.png plot219.png plot220.png
    plot221.png plot222.png plot223.png plot224.png plot225.png plot226.png
    plot227.png plot228.png plot229.png plot230.png plot231.png plot232.png
    plot233.png plot234.png plot235.png plot236.png plot237.png plot238.png
    plot239.png plot240.png plot241.png plot242.png plot243.png plot244.png
    plot245.png plot246.png plot247.png plot248.png plot249.png plot250.png
    plot251.png plot252.png plot253.png plot254.png plot255.png
    'meteorite-landings.gif'
Output at: meteorite-landings.gif

Insights

Resources

I reused some code and modified examples from:

  1. https://rpubs.com/MVellinger/Gibeon

  2. http://relevantmisc.com/ggplot/instagram/2016/02/14/ig-over-time/

  3. https://rpubs.com/sjackman/gapminder-gganimate

Thanks to Bob Rudis for helping me to get ImageMagick installed (Twitter is a powerful resource)

LS0tCnRpdGxlOiAiTWV0ZW9yaXRlIExhbmRpbmdzIgphdXRob3I6ICJKYXNtaW5lIER1bWFzIChqYXNtaW5lLmR1bWFzQGdtYWlsLmNvbSkiCmRhdGU6ICIyMDE3LTAzLTExIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgojIyBTdW1tYXJ5CgpUaGlzIGNvbXByZWhlbnNpdmUgZGF0YSBzZXQgZnJvbSBUaGUgTWV0ZW9yb2xvZ2ljYWwgU29jaWV0eSBjb250YWlucyBpbmZvcm1hdGlvbiBvbiBhbGwgb2YgdGhlIGtub3duIG1ldGVvcml0ZSBsYW5kaW5ncy4gCgojIyBBbmFseXNpcwoKVGhlIGdvYWwgb2YgdGhpcyBhbmFseXNpcyBpcyB0byBjcmVhdGUgYW4gaW5zaWdodGZ1bCBhbmQgaW50ZXJhY3RpdmUgZGF0YSB2aXN1YWxpemF0aW9uIHdoaWNoIGRyYXdzIHNvbWUgaW5mZXJlbmNlIGFib3V0IG1ldGVvcml0ZSBsYW5kaW5nIGxvY2F0aW9ucywgbWFzcywgYW5kIHllYXIgb2Ygb2NjdXJyZW5jZS4gCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkoUlNvY3JhdGEpCmxpYnJhcnkoZGV2dG9vbHMpCmxpYnJhcnkoZ2dhbmltYXRlKQpsaWJyYXJ5KG1hZ2ljaykKbGlicmFyeShkcGx5cikKbGlicmFyeShnZ21hcCkKbGlicmFyeShnYXBtaW5kZXIpCmxpYnJhcnkoYW5pbWF0aW9uKQpsaWJyYXJ5KGx1YnJpZGF0ZSkKYGBgCgpgYGB7cn0KZGF0YV9pbiA8LSByZWFkLnNvY3JhdGEoImh0dHBzOi8vZGF0YS5uYXNhLmdvdi9TcGFjZS1TY2llbmNlL01ldGVvcml0ZS1MYW5kaW5ncy9naDRnLTlzZmgiKQpgYGAKCmBgYHtyfQpoZWFkKGRhdGFfaW4pCmBgYAoKIyMjIENsZWFuIHVwIGNvbHVtbiBuYW1lcwpgYGB7cn0KbmFtZXMoZGF0YV9pbilbYygzLCA0LCA1LCA2LCA4LCA5KV0gPC0gYygibmFtZV90eXBlIiwgImNsYXNzIiwgIm1hc3MiLCAiZm91bmQiLCAibGF0aXR1ZGUiLCAibG9uZ2l0dWRlIikKbmFtZXMoZGF0YV9pbikKYGBgCiMjIyBGaXggdGhlIHllYXIgYnkgcmVtb3ZpbmcgTU0tREQKYGBge3J9CmRhdGFfaW4keWVhcl9maXggPC0geWVhcihkYXRhX2luJHllYXIpCmBgYAojIyMgRXhwbG9yZSB0aGUgdmFyaWFibGVzIGJ5IGNsYXNzIGRpc3RyaWJ1dGlvbgpgYGB7cn0KZGF0YV9pbiAlPiUgZ3JvdXBfYnkoY2xhc3MpICU+JSAKICAgICAgICAgICAgc3VtbWFyaXNlKG4gPSBuKCkpICU+JSAKICAgICAgICAgICAgYXJyYW5nZShkZXNjKG4pKQpgYGAKCmBgYHtyfQpkYXRhX2luICU+JSBncm91cF9ieShuYW1lX3R5cGUpICU+JSAKICAgICAgICAgICAgc3VtbWFyaXNlKG4gPSBuKCkpICU+JSAKICAgICAgICAgICAgYXJyYW5nZShkZXNjKG4pKQpgYGAKCiMjIyBGaWx0ZXIgb3V0IGVycm9uZW91cyBsYXRpdHVkZXMgYW5kIGxvbmdpdHVkZXMKYGBge3J9CmRhdGFfaW5fY2xlYW4gPC0gZGF0YV9pbiAlPiUgZmlsdGVyKGxhdGl0dWRlID49IC05MCAmIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXRpdHVkZSAgPD0gOTAgJiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZ2l0dWRlID49IC0xODAgJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25naXR1ZGUgPD0gMTgwICAmIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhaXMubmEobWFzcyksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhaXMubmEoeWVhcikpCmBgYAoKIyMjIENsZWFuIHVwIG1ldGhvZCBvZiB3aGV0aGVyIHRoZSBtZXRlb3JpdGUgd2FzIEZvdW5kIG9yIG5vdApgYGB7cn0KZGF0YV9pbl9jbGVhbiRmb3VuZCA8LSBpZl9lbHNlKGRhdGFfaW5fY2xlYW4kZm91bmQgPT0gIkZlbGwiLCAiTm8iLCAiWWVzIikKYGBgCgoKIyMgVmlzdWFsaXphdGlvbnMKCiMjIyBTZXQgdXAgc29tZSBvcHRpb25zIGZvciBwbG90dGluZwpgYGB7cn0KdGhlbWVfc2V0KHRoZW1lX21pbmltYWwoKSkKCm9wdGlvbnMoc2NpcGVuPTEwMDAwKQpgYGAKCiMjIyBTdGF0aWMgZGlzcGxheQpgYGB7cn0KcCA8LSBnZ3Bsb3QoKSArCiAgICBib3JkZXJzKCJ3b3JsZCIsIGNvbG91cj0iZ3JheTUwIikgKwogICAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZSwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IGZvdW5kLCBmcmFtZSA9IHllYXJfZml4KSwgZGF0YSA9IGRhdGFfaW5fY2xlYW4sIGFscGhhID0gLjUpICsKICAgIGxhYnModGl0bGUgPSAiV29ybGR3aWRlIE1ldGVvcml0ZSBMYW5kaW5ncyAiLCAKICAgICAgIHggPSAiIiwgeSA9ICIiKSArCiAgICB0aGVtZShsZWdlbmQucG9zaXRpb249ImJvdHRvbSIsIAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2JsYW5rKCkpCnAKYGBgCgoKYGBge3IsIGZpZy5zaG93ID0gImFuaW1hdGUifQpnZ2FuaW1hdGUocCwgIm1ldGVvcml0ZS1sYW5kaW5ncy5naWYiKQpgYGAKCiMjIEluc2lnaHRzCgoqIERvbWluYXRlIGFyZWFzIHdoZXJlIG1ldGVvcml0ZXMgd2VyZSBmb3VuZCBhcmU6IEF1c3RyYWxpYSwgVVNBLCBhbmQgQW50YXJ0aWNhCgoKIyMgUmVzb3VyY2VzCgoqSSByZXVzZWQgc29tZSBjb2RlIGFuZCBtb2RpZmllZCBleGFtcGxlcyBmcm9tOioKCjEuIFtodHRwczovL3JwdWJzLmNvbS9NVmVsbGluZ2VyL0dpYmVvbl0oaHR0cHM6Ly9ycHVicy5jb20vTVZlbGxpbmdlci9HaWJlb24pCgoyLiBbaHR0cDovL3JlbGV2YW50bWlzYy5jb20vZ2dwbG90L2luc3RhZ3JhbS8yMDE2LzAyLzE0L2lnLW92ZXItdGltZS9dKGh0dHA6Ly9yZWxldmFudG1pc2MuY29tL2dncGxvdC9pbnN0YWdyYW0vMjAxNi8wMi8xNC9pZy1vdmVyLXRpbWUvKQoKMy4gW2h0dHBzOi8vcnB1YnMuY29tL3NqYWNrbWFuL2dhcG1pbmRlci1nZ2FuaW1hdGVdKGh0dHBzOi8vcnB1YnMuY29tL3NqYWNrbWFuL2dhcG1pbmRlci1nZ2FuaW1hdGUpCgoqVGhhbmtzIHRvIFtCb2IgUnVkaXNdKGh0dHBzOi8vdHdpdHRlci5jb20vaHJicm1zdHIvc3RhdHVzLzg0MDYyMjQ2NjcwNzkyMjk0NCkgZm9yIGhlbHBpbmcgbWUgdG8gZ2V0IEltYWdlTWFnaWNrIGluc3RhbGxlZCAoVHdpdHRlciBpcyBhIHBvd2VyZnVsIHJlc291cmNlKSo=